/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.losalpes.compras;

import com.losalpes.persistence.entity.Articulo;
import com.losalpes.persistence.entity.Compra;
import java.util.ArrayList;
import java.util.Date;
import javax.ejb.Local;

/**
 *  Interface encargada de definir los metodos del EJB encargado de
 * las compras en el aplicativo
 * @author Oscar Ballesteros
 */
@Local
public interface IComprasServices {

    /**
     * Metodo encargado de registrar una compra en el sistema.
     * @param compra Compra a registrar.
     * @return Compra efectuada.
     */
    Compra realizarCompra(Compra compra);

    /**
     * Metodo encargado de obtener una referencia para la compra que se realizara
     * @return Numero que representa la referencia a realizar.
     */
    Integer obtenerSiguienteReferencia();

    /**
     * Metodo encargado de obtener todas las compras realizadas en el sistema.
     * @return Listado de compras
     */
    ArrayList<Compra> findAll();

    /**
     * Metodo encargado de procesar el reporte de compras por fecha.
     * @param fechaInicial limite inferior de la busqueda
     * @param fechaFinal limite superior de la busqueda
     * @return comprar que cumplen el filtro de fechas
     */
    ArrayList<Compra> findAllByDate(Date fechaInicial, Date fechaFinal);

    /**
     * Metodo encargado de procesar el reporte de mubles de tipo interior vendidos.
     * @param compras compras realizadas
     * @return Listado de articulos comprados.
     */
    ArrayList<Articulo> findAllArticulosByTipoInterior(ArrayList<Compra> compras);

    /**
     * Metodo encargado de procesar el reporte de muebles de tipo exterior vendidos.
     * @param compras compras sobre las que se busca los articulos.
     * @return listado de articulos vendidos.
     */
    ArrayList<Articulo> findAllArticulosByTipoExterior(ArrayList<Compra> compras);

    /**
     * Metodo encargado de procesar el reporte de articulos mas vendidos
     * @param fechaInicial limite inferior del reporte
     * @param fechaFinal limite superior del reporte
     * @param ciudad ciudad en la que se realiza la compra
     * @return Listado de articulos que cumplen las caracteristicas
     */
    Articulo findMostSold(Date fechaInicial, Date fechaFinal, String ciudad);

    /**
     * Metodo encargado de procesar el reporte de compras por usuario
     * @param numeroDocumento identificador del cliente
     * @param fechaInicial limite superior del reporte
     * @param fechaFinal limite inferior del reporte
     * @return Listado de compras realizadas por el cliente.
     */
    ArrayList<Compra> findAllByCustomerId(String numeroDocumento, Date fechaInicial, Date fechaFinal);

    /**
     * Metodo encargado de obtener el valor total de una compra especifica
     * @param articulosExterior articulos de tipo Exterior
     * @param articulosInterior articulos de tipo Interior
     * @return valor de la compra
     */
    double getTotal(ArrayList<Articulo> articulosExterior, ArrayList<Articulo> articulosInterior);

    /**
     * Metodo encargado de obtener el catalogo de la compra
     * @return Listado con los nombres de ciudades.
     */
    ArrayList<String> findAllCities();
}
